3 const int oo
= 1000000000;
5 int v
, w
; edge(){} edge(int v
, int w
) : v(v
), w(w
) {}
7 vector
<edge
> g
[MAXNODES
];
11 // Retorna falso si hay un ciclo de costo negativo alcanzable
12 // desde s. Si retorna verdadero, entonces d[i] contiene la
13 // distancia más corta para ir de s a i. Si se quiere
14 // determinar la existencia de un costo negativo que no
15 // necesariamente sea alcanzable desde s, se crea un nuevo
16 // nodo A y nuevo nodo B. Para todo nodo original u se crean
17 // las aristas dirigidas (A, u) con peso 1 y (u, B) con peso
18 // 1. Luego se corre el algoritmo de Bellman-Ford iniciando en
20 bool bellman(int s
, int n
){
21 for (int i
=0; i
<n
; ++i
){
27 for (int i
=0, changed
= true; i
<n
-1 && changed
; ++i
){
29 for (int u
=0; u
<n
; ++u
){
30 for (int k
=0; k
<g
[u
].size(); ++k
){
31 int v
= g
[u
][k
].v
, w
= g
[u
][k
].w
;
41 for (int u
=0; u
<n
; ++u
){
42 for (int k
=0; k
<g
[u
].size(); ++k
){
43 int v
= g
[u
][k
].v
, w
= g
[u
][k
].w
;
45 //Negative weight cycle!
47 //Finding the actual negative cycle. If not needed
48 //return false immediately.
49 vector
<bool> seen(n
, false);
52 for (; !seen
[cur
]; cur
= p
[cur
]){
54 cycle
.push_front(cur
);
56 cycle
.push_front(cur
);
57 //there's a negative cycle that goes from
58 //cycle.front() until it reaches itself again
59 printf("Negative weight cycle reachable from s:\n");
62 printf("%d ", cycle
[i
]);
64 }while(cycle
[i
] != cycle
[0]);
66 // Negative weight cycle found